跳到主要内容

比特币

比特币的基本概念

比特币(Bitcoin,BTC)是一种非常典型的、去中心化的加密数字货币。比特币的特点是:一种可以用来支付的电子现金,一种点对点无需中间人的电子现金,一种发行量恒定的电子现金。

中本聪关于比特币的论文请参看《比特币:一种点对点电子货币系统》的中文翻译版,在本书参考资料部分。

发行机制

和法定货币相比,比特币没有一个集中的发行方,而是由比特币网络节点的计算生成,谁都有可能参与制造比特币,而且比特币全世界流通,可以在任意一台接入互联网的个人计算机上买卖,不管身处何方,任何人都可以挖掘、购买、出售和获取比特币。比特币在交易过程中外人无法辨认用户身份信息,且可以不受任何国家的央行和任何金融机构控制而自由流通。

比特币网络通过“挖矿”来生成新的比特币。所谓“挖矿”实质上是通过用计算机解决一项复杂的数学问题,来保证比特币网络分布式记账系统的一致性。比特币网络会自动调整数学问题的难度,让整个网络约每10分钟得到一个合格答案。随后比特币网络会新生成一定量的比特币作为赏金,以奖励获得答案的人。

比特币的总发行量是2100万枚。2009年比特币诞生的时候,每笔赏金是50个比特币。比特币网络诞生10分钟后,第一批50个比特币生成了,而此时的全网货币总量就是50。随后比特币就以约每10分钟50个的速度增长。当全网总量达到1050万个时(2100万的50%),挖矿赏金减半为25个,当总量达到1575万个(新产出525万个,即1050万的50%)时,赏金再减半为12.5个。

交易机制

未花费的交易输出(UTXO) 比特币交易就是从一个比特币钱包向另一个比特币钱包中转账比特币,每笔交易都有数字签名来保证安全。一个交易一旦发生那么就是对所有人都公开的。比特币系统中其实并不存在所谓的账户,而只有“地址”。只要你愿意,你可以在比特币区块链上设无限多个钱包地址,每个地址都有对应的私钥。你拥有的比特币总量是你所有钱包地址中的比特币之和。比特币系统并不会帮你把这些地址汇总起来形成你的账户。其实在比特币系统中并不存在比特币,只有UTXO,每一笔比特币都源自上一个交易,是上一个交易的未花费的交易输出。

比特币的源头是一种特殊的交易——比特币矿工因挖矿生成区块而获得奖励的币基交易(coinbase transaction)。假设我作为比特币矿工挖矿成功赢得了25枚比特币,那么这个特殊交易是:它的输入是0,输出是25枚比特币进到矿工的钱包地址中。25枚比特币是这个币基交易的UTXO。

防双花机制

  • 双花问题:加密数字货币和其他数字资产一样,具有无限可复制性,人们没有办法确认一笔数字现金是否已经被花掉。因此,在交易中必须有一个可以信赖的第三方来保留交易总账,从而保证每笔数字现金只会被花掉一次。
  • 双花问题的解决:使用区块链盖时间戳并全网广播的方式,保证每笔货币被支付后,不能再用于其他支付。当且仅当包含在区块中的所有交易都是有效的且之前从未存在过的,其他节点才认同该区块的有效性。通过这种方式解决了去中心化的比特币网络中的“双花”问题。

加密机制

  • 非对称性加密算法:这种算法通常需要两个密钥:公开密钥(public key)和私有密钥(private key),公开密钥与私有密钥是一对。如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 哈希算法:区块链中最常使用的两个哈希算法分别是:SHA-256算法,主要用于完成PoW(工作量证明)计算;RIPEMD-160算法,主要用于生成比特币地址。
  • 哈希指针:区块链就可以看作一类使用哈希指针的链表。这个链表链接一系列的区块,每个区块包含数据以及指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告诉前一个区块的位置,也提供一个哈希值去验证这个区块所包含的数据是否发生改变。
  • 默克尔树:Merkle树是区块链中重要的数据结构,其作用是快速归纳和校验区块数据的存在性和完整性。比特币网络中,通过Merkle树检查是否一个区块包含了某笔交易,而无须下载整个区块数据,即实现SPV“简单支付验证”
  • 椭圆曲线算法:比特币中使用基于secp256k1椭圆曲线算法进行签名与验证签名,一方面可以保证用户的账户不被冒名顶替,另一方面保证用户不能否认其所签名的交易。用户用私钥对交易信息签名,矿工用用户的公钥验证签名,验证通过,则交易信息记账,完成交易。

比特币的数据结构

区块链之所以被称为blockchain,是因为它的区块(block)以链(chain)的形式存储。从第一个区块(即所谓的创世区块)开始,新增的区块不断被连到上一个区块的后面,形成一个链条。

每个区块由两部分组成:区块头部和区块数据(区块体)。其中,区块头部中有一个哈希指针指向上一个区块,这个哈希指针包含前一个数据块的哈希值。哈希值可以被看成数据块的指纹,即在后一个区块的头部中均存储有上一个区块数据的指纹。

比特币区块链的数据结构中包括两种哈希指针,它们均是不可篡改特性的数据结构的基础:一个是形成“区块+链”的链状数据结构,另一个是哈希指针形成的梅克尔树。链状数据结构使得对某一区块内数据的修改很容易被发现;梅克尔树的结构起类似作用,使得对二叉树型结构的任何交易数据的修改很容易被发现

比特币的获取机制--挖矿

节点计算机在挖矿时要做两个任务。第一个任务是把比特币网络中未被确认的交易按梅克尔树组合成候选区块,未被纳入的交易往下顺延。在创建候选区块时,除了普通的交易之外,矿工还增加了一个特殊的交易——币基交易。如果它的候选区块成为正式区块即挖矿成功,币基交易会凭空转出新区块奖励比特币到矿工的钱包地址中,从而实质上将这些比特币凭空发行出来。这个特殊交易也被叫作“创币交易”,新的比特币就是在这一交易中被创造出来的。

第二个任务是真正的算力竞争,即进行加密哈希计算,解决一个计算难题。在众多争夺记账权的节点中,谁最先完成这个计算,谁打包的区块就被加到区块链的最后面,成为最新的正式区块并获得奖励。最初,成功挖出一个区块,矿工可以获得50个比特币的奖励,按规则,这个挖矿奖励约每四年减半一次,奖励依次变成每个区块25个、12.5个,以此类推。

在候选区块的头部有一个32位的随机数区域,矿工需要反复调整随机数并计算,目标是让这个区块的哈希值小于一个所谓的“目标值”。如果试过所有32位随机数的可能性后,计算仍未成功,那么就要反复改变币基的一个随机数,进行计算,以让这个区块的哈希值小于目标值。

这里所需要进行的加密哈希函数计算(对比特币来说是SHA-256),除了反复计算别无他法,也就是各个节点完全凭借计算能力进行竞争。这种所谓的挖矿竞争的计算量非常大,比如在2015年年底,在大约2的68次方(这个数字比全球总人口的平方还要大)个随机数中,只有一个可以成功有意思的是,这种挖矿计算是非对称性的,你挖矿需要经过2的68次方个哈希计算,而我要验证你的确找到了有效的随机数,只需要一次就可以。这种非对称性是区块链在技术上的重要特性:矿工需要消耗大量算力,检验者与使用者却不需要。

第一个完成这个计算难题的节点所打包的区块会成为正式区块。节点向全网广播告知自己已经完成计算,由其他节点确认后(即有别的挖矿节点在这个区块之后进行下一个区块的计算竞争,生成更新的区块)。在等待6个区块确认后,该挖矿节点就可以正式获得奖励。

数据验证是区块链技术极为重要的一环。所有的区块链网络中的参与者都要随时监听新的交易与新的区块。一旦接收到新的交易或者新的区块均需首先验证它们的正确性,如果正确后再向自己的临近节点进行传播。如果接收到的新交易无效,则需立即抛弃,不再将它们转给临近节点,以免浪费计算资源。对于新交易的验证,根据基于区块链应用事先达成的各种验证协议来进行,比如交易的格式、交易的数据结构、格式的语法结构、输入输出、数字签名的正确性等。所有的新交易数据一旦验证通过后,节点会将这些交易数据放在一个交易池中。当节点确认了上一个区块以后,节点将按一定优先级次序从交易池中选出交易计算Merkle根。节点通过自己强大的算力(工作量证明)找到符合难度目标的随机数后,并在第一时间将新挖出的区块广播给其他节点,以便其他节点确认该区块,并将获得验证的新区块加入到原有的区块链中。

为了应对这种可预见的算力增长,比特币系统有一个对应的机制设计:随着算力的增加,定期调整目标值的难度,使得挖出一个区块的时间始终在10分钟左右。

这就形成了一种动态的平衡,维持区块链网络经济激励的有效性的同时,也维持了区块的时间间隔和系统的稳定性。这个决定难度的公式非常简单明了,每挖出2016个区块,也就是经过约两个星期,挖矿难度会进行一次调整,该公式是:下一个难度=上一个难度×2016×10分钟/产生2016个区块所需的时间

如果算力突然大幅度增加,产生上一组2016个区块所需的时间变短,那么难度就会上升。在某些特殊情况下,如果产生上一组2016个区块所需的时间变长,那么难度也会下降,但并不多见。

总的来说,比特币节点计算机所做的是,它以算力参与分布式账本的确认,并以这种方式参与这一去中心网络的运维。比特币区块链是由众多节点组成的去中心网络,而这些计算机节点加入这个网络,计算分布式账本、运维网络,是因为中本聪在设计系统时巧妙地加入了经济激励。算力竞争加经济激励就是比特币区块链的工作量证明共识机制。

算力

每单位时间的哈希运算次数:H/S(Hash per second)

全网算力

比特币所有节点,当前难度下,寻找到nonce的平均每秒进行的次数。